﻿package com.components
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
	
	import flash.events.MouseEvent;
	
	import com.components.PlayerPointer;
	
	import com.conf.PlayerSpec;
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// PlayerButton ::
	// - composant type bouton à 4 états : up, over, down, hitTest (= selected)
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public class PlayerButton extends PlayerPointer
	{
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// MEMBRES DE CLASSE
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		private var _hitTestState			: MovieClip
		
		private var _isSelected 			: Boolean = false;
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// CONSTRUCTEUR
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		function PlayerButton()
		{
			super();
			
			addEventListener( MouseEvent.CLICK, handleMouseActions );
			addEventListener( PlayerSpec.WIDGET_BUTTON_STATE_CHANGE_UP, handleMouseActions );
			addEventListener( PlayerSpec.WIDGET_BUTTON_STATE_CHANGE_HIT_TEST, handleMouseActions );
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODES PROTEGEES : MECANISMES INTERNES DU COMPOSANT (surcharge de la méthode parente)
		// implémentent le nouvel état : hitTest
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		override protected function init( ) : void
		{
			upState = new MovieClip();
			overState = new MovieClip();
			downState = new MovieClip();
			hitTestState = new MovieClip();
			
			super.initProps( PlayerSpec.BTN_FOUR_STATES );
			
			// on déclenche manuellement le premier état au chargement du composant
			handleMouseActions( new MouseEvent( MouseEvent.MOUSE_UP ) );
		}
		
		override protected function handleMouseActions( pEvt : MouseEvent ) : void
		{
			switch( pEvt.type )
			{
				case MouseEvent.MOUSE_UP:
				activeVisibilityOnUpState( );
				break;
				
				case MouseEvent.MOUSE_DOWN :
				super.activeVisibilityOn( downState );
				break;
				
				case MouseEvent.MOUSE_OVER :
				super.activeVisibilityOn( overState );
				break;
				
				case MouseEvent.MOUSE_OUT :
				activeVisibilityOnUpState( );
				break;
				
				case MouseEvent.CLICK :
				isSelected = !isSelected;
				activeVisibilityOnUpState( );
				break;
				
				case PlayerSpec.WIDGET_BUTTON_STATE_CHANGE_UP:
				isSelected = false;
				activeVisibilityOn( upState );
				break;
				
				case PlayerSpec.WIDGET_BUTTON_STATE_CHANGE_HIT_TEST:
				isSelected = true;
				activeVisibilityOnUpState( );
				break;
				
				default :
				activeVisibilityOnUpState( );
				break;
			}
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODE PRIVEE : méthode générique basée sur une méthode parente qui détermine l'élément graphique
		// à afficher, selon la propriété isSelected
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		// permet de déterminer si le composant doit s'afficher graphiquement comme 'up' ou 'hitTest'
		private function activeVisibilityOnUpState( ) : void
		{
			if ( isSelected )
					super.activeVisibilityOn( hitTestState );
				else
					super.activeVisibilityOn( upState );
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// GETTER & SETTER
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function get hitTestState ( ) : MovieClip
		{
			return _hitTestState;
		}
		
		public function set hitTestState( val : MovieClip ) : void
		{
			_hitTestState = val;
		}
		
		public function get isSelected ( ) : Boolean
		{
			return _isSelected;
		}
		
		public function set isSelected( val : Boolean ) : void
		{
			_isSelected = val;
		}
	}
}